package com.hzit.aop.proxy.dynamic;

import com.hzit.aop.UserDAO;
import com.hzit.aop.impl.UserDaoImpl;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;


import java.lang.reflect.Method;

/**
 * CGLIB实现的动态代理
 */
public class CGLIBUserDaoDynamicProxyImpl implements MethodInterceptor {
	//1. 创建代理对象
	public UserDaoImpl createProxy(){
		//1.1 构造一个Enancer对象
		Enhancer enhancer = new Enhancer();
		//1.2 设置回调，要求实现Callback接口
		enhancer.setCallback(this);
		//1.3 设置Enhancer的父类
		enhancer.setSuperclass(UserDaoImpl.class);
		//1.4 返回生成的代理对象
		return (UserDaoImpl) enhancer.create();
	}
	//2. 通过此方法调用目标对象的同名方法
	@Override
	public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
		//2.1 如果方法名为query，则进行安全性检查
		if(method.getName().equals("query")){
			checkSecurity();
		}
		//2.2 调用目标方法
		return methodProxy.invokeSuper(o,objects);
	}
	private void checkSecurity(){
		System.out.println("【CGLIB动态代理版本】正在进行安全性检查。。。");
	}
}
